package fileUtils;

import java.io.*;

/**
 * 文件切分工具类
 */

public class SplitUtil {

    /**
     * 对一个文件，按照指定的最大行数进行拆分，拆成多个子文件并写入目标文件夹</br>
     * 保持子文件与原文件的文件类型一致
     *
     * @param fileName      原文件名
     * @param lineNumber    每个子文件的最大行数
     * @param oriDirPath    原文件的文件夹绝对路径
     * @param targetDirPath 目标文件夹的绝对路径
     * @throws IOException 读写文件异常
     */
    public static void splitFile(String fileName, Integer lineNumber, String oriDirPath, String targetDirPath) throws IOException {

        //从原文件名中解析文件名称和扩展名
        int indexForExtension = fileName.lastIndexOf(".");
        String fileOriName = fileName.substring(0, indexForExtension);
        String extension = fileName.substring(indexForExtension);

        BufferedReader reader = new BufferedReader(new FileReader(oriDirPath + "\\" + fileName));

        String line;
        //子文件个数
        int fileNumber = 1;
        //本次子文件读入的行数
        int lineCount = 0;

        //按行读取原文件中的内容
        StringBuilder builder = new StringBuilder();
        while ((line = reader.readLine()) != null) {
            builder.append(line).append("\n");
            lineCount++;

            //读取行数达到拆分目标行数后，将读取内容写入新文件并重置过程变量
            if (lineCount == lineNumber) {
                //拼接新文件名（全路径）：目标文件夹 + 原文件名 + 子文件个数 + 原文件扩展名
                String newFileName = targetDirPath + "\\" + fileOriName + "_" + fileNumber + extension;
                writeToFile(newFileName, builder.toString());
                builder.setLength(0);
                lineCount = 0;
                fileNumber++;
            }
        }

        //将剩余未达到拆分行数的内容写入一个新文件
        if (lineCount > 0) {
            String newFileName = targetDirPath + "\\" + fileOriName + "_" + fileNumber + extension;
            writeToFile(newFileName, builder.toString());
        }
    }

    /**
     * 向目标文件中写入内容
     *
     * @param fileName 目标文件名（全路径）
     * @param content  文件内容
     * @throws IOException 目标文件已存在但类型是文件夹、目标文件只读、目标文件不存在但无法被创建时，抛出异常
     */
    private static void writeToFile(String fileName, String content) throws IOException {
        BufferedWriter writer = new BufferedWriter(new FileWriter(fileName));
        writer.write(content);
        writer.close();
    }
}
